package com.hanlin.day02;

/**
 * 描述：随机数玩法
 *
 * @author:hl.yuan
 * @date:2021-05-27
 */
public class DataRandom {

    /**
     * 现有一个函数可以得出 1~5是概率平均，怎么根据这个函数，得到1-7也概率平均
     * 条件：不能修改f1函数。
     */
    public static int f1() {
        return (int) (Math.random() * 5)+1;
    }

    public static int f2() {
        // 因为f1是平均取1~5的值，所以 1~2 和 4~5 的取值范围概率是相等的，我们可以设计当在1~2范围为0 4~5范围为1，为3的时候，重新来算
        // 这样设计的目的是让0和1出现的概率相等！
        int index = 0;
        do {
            index = f1();
        } while (index == 3);
        return index < 3 ? 0 : 1;
    }


    public static int f3() {
        // 我们可以想像7的二进制是不是 111
        // 而我们的f2是不是0和1是等概率的，那么我们可以用二进制来表示

        // (f2() << 2) + (f2() << 1) + (f2() << 0)  这个就是等概率出现000~111的二进制，所以到这里我们就求出了0到7的等概率
        return (f2() << 2) + (f2() << 1) + (f2() << 0);
    }


    public static int f4() {
        // 接着f3方法，我们求出了0到7的等概率，那我们可以加上1，变成1~8的等概率，然后等于8的时候，重新来，就是1~7的概率
        int index = 0;
        do {
            index = f3();
        } while (index == 7);
        return index+1;
    }

    public static void main(String[] args) {
        int[] arr = new int[8];
        for (int i = 0; i < 100000; i++) {
            arr[f4()]++;
        }

        for (int i = 0; i < 8; i++) {
            System.out.println(i + "这个数，出现了 " + arr[i] + " 次");
        }





    }


}
